package com.nep.NEPS.controller;

import com.nep.common.util.ApplicationContextUtil;
import com.nep.common.util.AuthUtil;
import com.nep.common.util.SceneSwitcherUtil;
import com.nep.entity.supervisor.Report;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;


import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ResourceBundle;

import static com.nep.common.util.AlertUtil.showError;

/**
 * 监督员报告记录控制器
 * 负责展示环境监测报告列表，支持数据加载、表格渲染和详情查看
 */
public class SupervisorRecordViewController implements Initializable {

    @FXML
    private TableView<Report> reportTableView;        // 报告表格视图
    @FXML
    private TableColumn<Report, String> reportIdColumn; // 报告ID列
    @FXML
    private TableColumn<Report, LocalDateTime> dateColumn; // 日期列
    @FXML
    private TableColumn<Report, String> aqiLevelColumn; // AQI等级列
    @FXML
    private TableColumn<Report, String> gridAddrColumn; // 网格地址列
    @FXML
    private TableColumn<Report, String> descriptionColumn; // 描述列
    @FXML
    private Button backBtn; // 返回按钮
    @FXML
    private Label totalRecordLabel; // 记录总数标签


    private ObservableList<Report> reportList = FXCollections.observableArrayList(); // 报告数据集合

    /**
     * 初始化方法，在FXML加载完成后调用
     * 完成登录验证、表格初始化和数据加载
     */
    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        // 检查用户登录状态，未登录则跳转登录页面
        AuthUtil.checkLoginStatus(backBtn);

        // 初始化表格组件和列定义
        initTable();

        // 从服务加载报告数据
        loadReports();
    }

    /**
     * 初始化表格组件和列配置
     * 包括列值绑定、单元格渲染器设置
     */
    private void initTable() {
        // 绑定基础数据列（使用PropertyValueFactory自动映射Report属性）
        reportIdColumn.setCellValueFactory(new PropertyValueFactory<>("reportId"));
        gridAddrColumn.setCellValueFactory(new PropertyValueFactory<>("gridAddr"));
        descriptionColumn.setCellValueFactory(new PropertyValueFactory<>("description"));

        // 配置日期列的格式化渲染
        dateColumn.setCellValueFactory(new PropertyValueFactory<>("createTime"));
        dateColumn.setCellFactory(column -> {
            return new TableCell<Report, LocalDateTime>() {
                private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

                @Override
                protected void updateItem(LocalDateTime item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty || item == null) {
                        setText(null);
                    } else {
                        // 将LocalDateTime格式化为指定字符串格式
                        setText(formatter.format(item));
                    }
                }
            };
        });

        // 配置AQI等级列的条件渲染（不同等级显示不同颜色背景）
        aqiLevelColumn.setCellFactory(column -> {
            return new TableCell<Report, String>() {
                private final Label label = new Label();

                {
                    // 初始化标签样式和布局
                    label.setMaxWidth(Double.MAX_VALUE);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                }

                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty || item == null) {
                        // 清空单元格内容
                        setGraphic(null);
                        label.setText("");
                        label.setStyle("");
                    } else {
                        // 设置标签文本和根据AQI等级设置样式
                        label.setText(item);
                        String style = getStyleForAQILevel(item);
                        label.setStyle(style);
                        setGraphic(label);
                    }
                }

                /**
                 * 根据AQI等级获取对应的CSS样式
                 * @param aqiLevel AQI等级文本
                 * @return 对应的CSS样式字符串
                 */
                private String getStyleForAQILevel(String aqiLevel) {
                    switch (aqiLevel) {
                        case "优":
                            return "-fx-background-color: #4CAF50; -fx-text-fill: white;";
                        case "良":
                            return "-fx-background-color: #FFC107; -fx-text-fill: #333;";
                        case "轻度污染":
                            return "-fx-background-color: #FF9800; -fx-text-fill: white;";
                        case "中度污染":
                            return "-fx-background-color: #F44336; -fx-text-fill: white;";
                        case "重度污染":
                            return "-fx-background-color: #9C27B0; -fx-text-fill: white;";
                        case "严重污染":
                            return "-fx-background-color: #8B0000; -fx-text-fill: white;";
                        default:
                            return "-fx-background-color: #CCCCCC; -fx-text-fill: #333;";
                    }
                }
            };
        });

        // 将数据集合绑定到表格
        reportTableView.setItems(reportList);
    }

    /**
     * 从用户服务加载当前用户的报告数据
     * 包含错误处理和总数更新
     */
    private void loadReports() {
        // 清空现有数据
        reportList.clear();
        try {
            // 获取当前用户ID并加载对应报告
            String userId = ApplicationContextUtil.getInstance().getCurrentUser().getPhone();
            reportList.addAll(ApplicationContextUtil.getInstance().getUserService().getReportsByUserId(userId));
            // 更新记录总数显示
            updateTotalCount();
        } catch (Exception e) {
            e.printStackTrace();
            showError("系统错误", "加载报告数据时发生异常: " + e.getMessage());
        }
    }

    /**
     * 处理刷新按钮点击事件
     * 重新加载报告数据
     */
    @FXML
    private void handleRefresh() {
        loadReports();
    }

    /**
     * 处理返回按钮点击事件
     * 导航到监督员主界面
     */
    @FXML
    private void handleBack() {
        SceneSwitcherUtil.switchScene(backBtn, "/com/nep/NEPS/view/SupervisorMainView.fxml");
    }

    /**
     * 更新记录总数标签显示
     */
    private void updateTotalCount() {
        totalRecordLabel.setText("总计: " + reportList.size() + " 条记录");
    }
}